#ifndef __DLINKLIST_H_
#define __DLINKLIST_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef __cplusplus
extern "C"
{
#endif

#define DLL_D //启用打印命令

#ifdef DLL_D
#define DLLIST_DEBUG(format, ...)      \
	do                                 \
	{                                  \
		printf(format, ##__VA_ARGS__); \
	} while (0)
//#define DLLIST_DEBUG(format, ...) do{printf("Double Link List Debug: ");printf(format, ##__VA_ARGS__);}while(0)
#else
#define DLLIST_DEBUG(format, ...)
#endif

	typedef int elemType; //定义用户结构体

	/************************************************************************/
	/*             以下是关于线性表链接存储（双链表）操作的18种算法        */

	/* 1.初始化线性表，即置双链表的表头指针为空 */
	/* 2.创建线性表，此函数输入负数终止读取数据*/
	/* 3.打印链表，链表的遍历*/
	/* 4.清除线性表L中的所有元素，即释放双链表L中所有的结点，使之成为一个空表 */
	/* 5.返回双链表的长度 */
	/* 6.检查双链表是否为空，若为空则返回１，否则返回０ */
	/* 7.返回双链表中第pos个结点中的元素，若pos超出范围，则停止程序运行 */
	/* 8.从双链表中查找具有给定值x的第一个元素，若查找成功则返回该结点data域的存储地址，否则返回NULL */
	/* 9.把双链表中第pos个结点的值修改为x的值，若修改成功返回１，否则返回０ */
	/* 10.向双链表的表头插入一个元素 */
	/* 11.向双链表的末尾添加一个元素 */
	/* 12.向双链表中第pos个结点位置插入元素为x的结点，若插入成功返回１，否则返回０ */
	/* 13.向有序双链表中插入元素x结点，使得插入后仍然有序 */
	/* 14.从双链表中删除表头结点，并把该结点的值返回，若删除失败则停止程序运行 */
	/* 15.从双链表中删除表尾结点并返回它的值，若删除失败则停止程序运行 */
	/* 16.从双链表中删除第pos个结点并返回它的值，若删除失败则停止程序运行 */
	/* 17.从双链表中删除值为x的第一个结点，若删除成功则返回1,否则返回0 */
	/* 18.交换2个元素的位置 */
	/* 19.将线性表进行快速排序 */

	/************************************************************************/

	typedef struct Node
	{ /* 定义双链表结点类型 */
		elemType element;

		struct Node *next; //上一节点
		struct Node *prev; //下一节点
	} Node;

	/* 初始化链表，即置双链表头的指针为自己 */
	void initList(Node *pHead);
	/*设置节点的数据域*/
	int setListElem(Node *pNode, elemType element);
	//创建新节点
	Node *createListNode(elemType element);
	/* 从链表头插入一个节点*/
	int insertList(Node *pHead, Node *pNode);
	/* 从链表头尾插入一个节点*/
	int insertListTail(Node *pHead, Node *pNode);
	/* 删除一个节点*/
	int deleteList(Node *pNode);
	/* 清除线性表L中的所有元素，即释放双链表L中所有的结点 */
	int clearList(Node *pHead);
	/* 返回双链表的长度 */
	int sizeList(Node *pHead);
	/* 返回双链表中数据域为element的元素，若没有怎么返回NULL */
	Node *findListElem(Node *pHead, elemType element);
	/* 打印链表*/
	void printList(Node *pHead);

#ifdef __cplusplus
}
#endif

#endif